package BaseDatos;

import Modelo.Grupo;
import Modelo.Horario;
import Modelo.Profesor;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author Oscar
 */
public class GestorGrupo {

    private String URL_Servidor = "localhost";
    private static final String BASE_DATOS = "ADEHO";
    private static final String LOGIN = "root";
    private static final String PASSWORD = "root";
    private static final String CMD_LISTAR = "SELECT * from grupo;";
    private static final String CMD_OBTENER_GRUPO = "SELECT * FROM grupo WHERE seccion =?";
    private static final String CMD_OBTENER_SECCIONES = "SELECT seccion FROM grupo";
    private static final String CMD_INCLUIR = "INSERT into grupo VALUES (?,?,?)";
    private static final String CMD_BORRAR = "DELETE FROM grupo  WHERE seccion=?";
    private static final String CMD_OBTENER_SECCION = "SELECT * FROM grupo WHERE nivel=?  ";
    private static final String CMD_OBTENER_PROFEGUIA = "SELECT profesorGuia FROM grupo WHERE seccion=?";
    private static final String CMD_ULTIMA_SECCION = "SELECT seccion FROM grupo WHERE nivel=? ORDER BY seccion DESC limit 1";
    private static final String CMD_ASIGNAR_PROFEGUIA = "UPDATE grupo SET profesorGuia=? WHERE seccion=?";
    private static final String CMD_SECCION_PROFEGUIA = "SELECT * FROM grupo";
    private static final String CMD_CANTIDAD_SECCIONES = "SELECT COUNT(*) FROM GRUPO WHERE nivel=?";
    //nuevos
    private static final String CMD_BORRAR_GRUPOS_NIVEL = "DELETE FROM grupo WHERE nivel=?";
    private static final String CMD_ACTUALIZAR_GRUPOS_NIVEL = "update nivel set cantGrupo=? where idNivel=?";

    //private static final String CMD_SECCION_PROFEGUIA = "SELECT seccion, profesorGuia FROM grupo";
    GestorProfesor gp = new GestorProfesor();
    GestorNivel gn = new GestorNivel();

    public ArrayList<Grupo> ListarGrupos() {
        ArrayList<Grupo> grupos = new ArrayList();
        GestorBD bd = null;
        String idNivel = "";
        String seccion = "";
        String profesorGuia = "";

        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_LISTAR);

            while (rs.next()) {
                seccion = rs.getString(1);
                idNivel = rs.getString(2);
                profesorGuia = rs.getString(3);
                Grupo g = null;
                if (profesorGuia != null) {
                    g = new Grupo(seccion, profesorGuia, idNivel);
                } else {
                    g = new Grupo(seccion, idNivel);
                }
                grupos.add(g);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return grupos;
    }

    public int cantidadDeSecciones(String nivel) {
        int num = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_CANTIDAD_SECCIONES);
            stm.clearParameters();
            stm.setString(1, nivel);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                num = rs.getInt(1);
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
            System.err.println(e.getCause());
        } finally {
            bd.cerrarConexion();
        }
        return num;
    }

    public ArrayList<String> ListarSecciones() {
        ArrayList<String> secciones = new ArrayList();
        GestorBD bd = null;
        String seccion = "";

        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_OBTENER_SECCIONES);

            while (rs.next()) {
                seccion = rs.getString(1);
                secciones.add(seccion);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return secciones;
    }

    public ArrayList<Grupo> obtenerGrupoProfeGuia() {
        ArrayList<Grupo> grupos = new ArrayList();
        GestorBD bd = null;
        String seccion = "";
        String profesorGuia = "";
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_SECCION_PROFEGUIA);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                seccion = rs.getString(1);
                profesorGuia = rs.getString(2);
                Grupo g = null;
                if (profesorGuia != null) {
                    g = new Grupo(seccion, null, gp.obtenerProfesor(profesorGuia).getNombre());
                } else {
                    g = new Grupo(seccion, null, "No asignado");
                }
                grupos.add(g);
            }

            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }

        return grupos;

    }

    public Grupo obtenerGrupo(String pSeccion) {
        Grupo g = new Grupo();
        GestorBD bd = null;
        String idNivel = "";
        String seccion = "";
        String profesorGuia = "";

        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery("Select * from grupo where seccion='" + pSeccion + "';");

            while (rs.next()) {
                idNivel = rs.getString(3);
                seccion = rs.getString(1);
                profesorGuia = rs.getString(2);
                g = null;
                if (profesorGuia != null) {
                    g = new Grupo(seccion, idNivel, profesorGuia);
                } else {
                    g = new Grupo(seccion, idNivel);
                }
                return g;
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return g;
    }

    public boolean registroGrupo(String nivel, int cantidad) {
        boolean exito = false;

        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            cnx.setAutoCommit(false);
            CallableStatement prodAlmacenado = cnx.prepareCall("{call addgrupos(?,?)}");
            prodAlmacenado.setInt("cant", cantidad);
            prodAlmacenado.setString("nivel", nivel);
            exito = prodAlmacenado.execute();
            cnx.commit();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean registroUnGrupo(Grupo pGrupo) {
        boolean exito = false;
        int registrosActualizados = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_INCLUIR);
            stm.clearParameters();

            stm.setString(1, pGrupo.getSeccion());//seccion
            if (pGrupo.getProfesorGuia() == null) {
                stm.setString(2, null);//profesor guia
            } else {
                stm.setString(2, pGrupo.getProfesorGuia());//profesor guia
            }
            stm.setString(3, pGrupo.getIdNivel());//nivel
            registrosActualizados = stm.executeUpdate();
            exito = registrosActualizados == 1;
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public String obtenerUltimaSeccion(String idNivel) {
        String seccion = null;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_ULTIMA_SECCION);
            stm.clearParameters();
            stm.setString(1, idNivel);
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                seccion = rs.getString(1);

            }
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return seccion;
    }

    public boolean AsignarProfesorGuia(String seccion, String cedula) {
        boolean asignado = false;
        GestorBD bd = null;
        int registrosActualizados = 0;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement("UPDATE grupo SET profesorGuia='" + cedula + "' WHERE seccion='" + seccion + "';");
            stm.clearParameters();
            stm.executeUpdate();
            stm.close();
            return asignado = true;

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }

        return asignado;

    }

    public ArrayList<Grupo> obtenerSeccion(String nivel) {
        ArrayList<Grupo> grupos = new ArrayList();
        GestorBD bd = null;
        String idNivel = "";
        String seccion = "";
        String profesorGuia = "";
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_SECCION);
            stm.clearParameters();
            stm.setString(1, nivel);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                idNivel = rs.getString(3);
                seccion = rs.getString(1);
                profesorGuia = rs.getString(2);
                Grupo g = null;
                if (profesorGuia != null) {
                    g = new Grupo(seccion, idNivel, profesorGuia/*gp.obtenerProfesor(profesorGuia).getNombre()*/);
                } else {
                    g = new Grupo(seccion, idNivel);
                }
                grupos.add(g);
            }

            //stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return grupos;
    }

    public boolean verificarGuia(String seccion){
      boolean esta = false;
      GestorBD bd = null;
      int registrosActualizados = 0;
      try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_PROFEGUIA);
            stm.clearParameters();
            stm.setString(1, seccion);
            esta = stm.execute();
            stm.close();
            
            
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return esta;
        
        
    }
    public String obtenerProfeGuia(String pSeccion) {
      
        GestorBD bd = null;
        String profesorGuia = "";
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_PROFEGUIA);
            stm.clearParameters();
            stm.setString(1, pSeccion);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                profesorGuia = rs.getString(2);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return profesorGuia;
    }

    public ArrayList<Grupo> obtenerGrupoProfeGuia(ArrayList<Profesor> listaProfes) {
        ArrayList<Grupo> grupos = new ArrayList();
        GestorBD bd = null;
        Grupo g = null;
        String seccion = "";
        String nivel = "";
        String profesorGuia = "";
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_SECCION_PROFEGUIA);

            while (rs.next()) {
                seccion = rs.getString(1);
                nivel = rs.getString(3);
                profesorGuia = rs.getString(2);

                // Grupo g = new Grupo(seccion, nivel, profesorGuia);
                if (profesorGuia != null) {
                    for (int i = 0; i < listaProfes.size(); i++) {
                        if (listaProfes.get(i).getNombre().equals(profesorGuia)) {
                            g = new Grupo(seccion, null, listaProfes.get(i).getCedula());
                        }
                    }
                } else {
                    g = new Grupo(seccion, null, "No asignado");
                }
                grupos.add(g);
            }
            //stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return grupos;
    }

    public boolean eliminarGrupo(String seccion) {
        boolean borrado = false;
        int exito = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_BORRAR);
            stm.clearParameters();
            stm.setString(1, seccion);

            exito = stm.executeUpdate();
            if (exito != 0) {
                borrado = true;
            }
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public boolean actualizarNivel(String nivel, int cantidad) {

        boolean actualizar = false;
        int exito = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_ACTUALIZAR_GRUPOS_NIVEL);
            stm.clearParameters();
            stm.setInt(1, cantidad);
            stm.setString(2, nivel);

            exito = stm.executeUpdate();
            if (exito != 0) {
                actualizar = true;
            }
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return actualizar;

    }

    public boolean borrarGruposDeNivel(String nivel) {
        boolean borrado = false;
        int exito = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_BORRAR_GRUPOS_NIVEL);
            stm.clearParameters();
            stm.setString(1, nivel);

            exito = stm.executeUpdate();
            if (exito != 0) {
                borrado = true;
            }
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;

    }

}
